import pandas as pd
import numpy as np
import datetime as datetime
import warnings
import openpyxl
from openpyxl import load_workbook

import xlrd
import xlwt


# def readUser():
# 用户配置表 = '../文件/社保用户配置表.xlsx'
# userdate = pd.read_excel(用户配置表, dtype='str')
# print(userdate)
# 社保用户数据 = userdate.values.tolist()
# print(社保用户数据)
# time = datetime.datetime.now().strftime('%Y-%m-%d')
# print(time)


# readUser()

def dataDoing():
    社保数据接口数据 = '../文件/下载社保数据接口数据2024-03-04.xls'
    社保待缴人员表路径列表 = ['../文件/下载社保待缴人员2024-03-04.xls']
    # pd.set_option('display.max_columns', None)
    head = ['员工号', '人员姓名', '证件号码', '应收合计', '个人合计', '单位合计', '缴费基数', '个人交', '单位交',
            '缴费基数.1', '个人交.1', '单位交.1', '缴费基数.2', '单位交.2', '缴费基数.3', '个人交.2',
            '单位交.3', '缴费基数.4', '单位交.4', '大病医疗单位', '大病医疗个人', '社保代扣', '人员编码']
    for item in 社保待缴人员表路径列表:
        # 读取社保待缴人员表
        readExcel = pd.read_excel(item, header=4)
        warnings.filterwarnings('ignore')
        # 将社保待缴人员表中的'身份证号'转换为证件号码
        readExcel.rename(columns={'身份证号': '证件号码'}, inplace=True)
        # 将读取的数据进行保留两位小数操作
        # print(readExcel['个人合计'])
        readExcelList = readExcel['证件号码'].values.tolist()
        print(f'本次读取的证件号码有:{readExcelList}')
        # 读取社保数据接口表中的数据
        readInterfaceExcel = pd.read_excel(社保数据接口数据, dtype=str)
        # 匹配出社保数据接口中证件号码包含在readExcelList中的数据
        readInterfaceDate = readInterfaceExcel[readInterfaceExcel['证件号码'].isin(readExcelList)]
        print(f'匹配证件号码后的数据为{readInterfaceDate}')
        # 合并两个数据列表,并通过表头字段head ,获取其中需要的几列
        mergeDate = pd.merge(readInterfaceDate, readExcel, how='inner', on=['证件号码'])
        print("*****************")
        resultDate = mergeDate[head]
        # 将'个人合计'和'单位合计'字段都保留两位小数
        resultDate['个人合计'] = resultDate['个人合计'].map(lambda x: round(x, 2))
        resultDate['单位合计'] = resultDate['单位合计'].map(lambda x: round(x, 2))
        resultDateList = resultDate.values.tolist()
        print(f'将匹配后并保留小数后的数据转换成列表{resultDateList}')
        # 获取其中的行数,并将所有行数加1
        indexList = readInterfaceDate.index.tolist()

        for i in range(0, len(indexList)):
            indexList[i] = indexList[i] + 1
        print(f'处理后的行数列表{indexList}')

        # 打开xls文件，并在指定行中写入文件
        workbook = xlrd.open_workbook(社保数据接口数据)  # xlrd打开excel
        sheet = workbook.sheet_by_index(0)
        wb = xlwt.Workbook(encoding='utf-8')  # lxwt新建一个sheet页
        new_sheet = wb.add_sheet(sheet.name)
        for row_index in range(sheet.nrows):
            row = sheet.row_values(row_index)
            if row_index in indexList:
                index = indexList.index(row_index)
                # 写入新数据到新的sheet
                for col_index, value in enumerate(resultDateList[index]):
                    new_sheet.write(row_index, col_index, value)
                print(f'在{row_index}行中写入新数据:{resultDateList[index]}')
            else:
                # 写入旧数据到新的sheet
                for col_index, value in enumerate(row):
                    new_sheet.write(row_index, col_index, value)
        wb.save(社保数据接口数据)


# dataDoing()
# 整合特殊人员名单
def addOther():
    # 将其他的特殊人员写入到表格中
    社保数据接口数据 = '../文件/下载社保数据接口数据2024-03-04.xls'
    导入数据接口数据 = '../文件/导入数据接口数据2024-03-04.xls'
    特殊在保人员文件路径 = '../文件/特殊社保在保人员.xls'
    warnings.filterwarnings('ignore')
    readDate = pd.read_excel(社保数据接口数据)
    readOtherDate = pd.read_excel(特殊在保人员文件路径)
    lenth = len(readOtherDate)

    if (lenth > 0):
        concatDate = pd.concat([readDate, readOtherDate], axis=0)
        print('特殊在保人员文件中数据不为空,拼接特殊人员数据')
    else:
        concatDate = readDate
        # Log.Info('特殊在保人员文件中数据为空,没有特殊人员往下执行')
        print('特殊在保人员文件中数据为空,没有特殊人员往下执行')
    # 拼接特殊在保人员的数据
    concatDateHead = concatDate.columns.tolist()
    pd.set_option('display.max_columns', None)
    # 设置groupby后的计算规则

    # 将证件号码，这一列的类型装换为str 类型，才可以用groupby进行分组求和
    concatDate['证件号码'] = concatDate['证件号码'].astype(str)
    # # 根据证件号码进行分组求和 as_index
    # itemDateframe = concatDate.groupby('证件号码', as_index=False).agg(itemHeadMap)
    # itemDateframes = concatDate.groupby('证件号码',as_index='False').agg(itemHeadMap).reset_index()
    # 根据证件号码进行分组求和 as_index
    # itemDateframe = concatDate.groupby('证件号码', as_index=False).agg(itemHeadMap)
    headFirst = ['员工号', '人员姓名', '证件号码', '人员编码']
    for head in concatDateHead:
        if head in headFirst:
            concatDate[head] = concatDate.groupby('证件号码')[head].transform('first')
        else:
            concatDate[head] = concatDate.groupby('证件号码')[head].transform('max')
    print(concatDate)
    # 如果需要，可以删除重复的'A'列值
    concatDate.drop_duplicates(subset='证件号码', inplace=True)
    itemDateframe = concatDate.reset_index(drop=True).fillna('')
    # 所有结果做保留两位有效数字处理
    colList = itemDateframe.columns.tolist()
    nameList = ['社保应收合计', '社保个人合计', '社保单位合计', '养老保险缴费基数', '养老保险个人交', '养老保险单位交',
                '医疗保险缴费基数', '医疗保险个人交', '医疗保险单位交', '工伤保险缴费基数', '工伤保险单位交',
                '失业保险缴费基数', '失业保险个人交', '失业保险单位交', '生育医疗缴费基数', '生育医疗单位交',
                '大病医疗单位', '大病医疗个人', '社保代扣', '公积金缴存基数（元）', '公积金单位缴存比例',
                '公积金个人缴存比例', '公积金单位缴费', '公积金个人缴费', '公积金金额合计（元）', '公积金代扣']

    for name in colList:
        if name in nameList:
            itemDateframe[name] = itemDateframe[name].map(lambda x: round(x, 2))
    Log.Info(self, itemDateframe)
    # itemDateframe.fillna('')
    print(itemDateframe)
    # 写入.xls文件
    wb = xlwt.Workbook(encoding='utf-8')  # lxwt新建一个sheet页
    #    new_sheet = wb.add_sheet(sheet.name)
    sheet = wb.add_sheet('Sheet0')
    # 将DataFrame的列名写入Excel表头
    for i, col_name in enumerate(itemDateframe.columns):
        sheet.write(0, i, col_name)
    # 将DataFrame的数据写入Excel
    for i, row in itemDateframe.iterrows():
        for j, col in enumerate(row):
            sheet.write(i + 1, j, col)
    wb.save(社保数据接口数据)
    # # 打开xls文件，并在指定行中写入文件
    #    workbook = xlrd.open_workbook(社保数据接口数据)  # xlrd打开excel
    #    sheet = workbook.sheet_by_index(0)
    #    wb = xlwt.Workbook(encoding='utf-8')  # lxwt新建一个sheet页
    #    new_sheet = wb.add_sheet(sheet.name)
    #    for row_index in range(sheet.nrows):
    #        row = sheet.row_values(row_index)
    #        if row_index in indexList:
    #            index = indexList.index(row_index)
    #            # 写入新数据到新的sheet
    #            for col_index, value in enumerate(resultDateList[index]):
    #                new_sheet.write(row_index, col_index, value)
    #            print(f'在{row_index}行中写入新数据:{resultDateList[index]}')
    #        else:
    #            # 写入旧数据到新的sheet
    #            for col_index, value in enumerate(row):
    #                new_sheet.write(row_index, col_index, value)
    #    wb.save(社保数据接口数据)


# addOther()


# 核对数据接口数据是否正确
def checkDate():
    下载社保数据接口核对数据 = '../文件/下载社保数据接口数据2024-03-04.xls'
    特殊在保人员文件路径 = '../文件/特殊社保在保人员.xls'
    核对结果文件路径='../文件/核对结果.xlsx'
    pd.set_option('display.max_columns', None)
    社保待缴人员表路径列表 = ['../文件/下载社保待缴人员2024-03-04.xls']
    columnsname = {'序号': '社保台账序号', '电脑号': '社保台账电脑号', '姓名': '社保台账姓名',
                   '身份证号': '证件号码', '应收合计': '社保台账应收合计', '个人合计': '社保台账个人合计',
                   '单位合计': '社保台账单位合计', '缴费基数': '养老缴费基数', '个人交': '养老个人交',
                   '单位交': '养老单位交', '缴费基数.1': '医疗缴费基数', '个人交.1': '医疗个人交',
                   '单位交.1': '医疗单位交', '缴费基数.2': '工伤缴费基数',
                   '单位交.2': '工伤单位交', '缴费基数.3': '失业缴费基数', '个人交.2': '失业个人交',
                   '单位交.3': '失业单位交', '缴费基数.4': '生育缴费基数', '单位交.4': '生育单位交'}
    warnings.filterwarnings('ignore')
    # 读取社保数据接口表中的数据
    str_datemap={'人员编码': str,'证件号码': str,'员工号': str}  #设置一些读取excel时读取为str类型的数据


    readInterfaceExcel = pd.read_excel(下载社保数据接口核对数据,usecols='A:W',dtype=str_datemap)
    print(f'本次下载的数据接口核对数据有{len(readInterfaceExcel)}条')
    readOtherExcel = pd.read_excel(特殊在保人员文件路径,usecols='A:W',dtype=str_datemap)
    print(f'本次属于特殊人员的数据有{len(readOtherExcel)}条')

    lenth = len(readOtherExcel)
    if (lenth > 0):
        readInterfaceExcel = pd.concat([readInterfaceExcel, readOtherExcel], axis=0)
        print('特殊在保人员文件中数据不为空,拼接特殊人员数据')
    #拼接特殊人员表后,如果两行全部数据都想相同的,就去除一行
    readDate = readInterfaceExcel.drop_duplicates(keep='first')
    # print(readDate)

    resultDateList = []
    for item in 社保待缴人员表路径列表:
        # 读取社保待缴人员表
        readExcel = pd.read_excel(item, header=4)
        readExcel.rename(columns=columnsname, inplace=True)
        readExcel.fillna('', inplace=True)
        readexcelList = readExcel['证件号码'].values.tolist()
        index = readexcelList.index('')
        resultdate = readExcel.iloc[0:index]
        resultDateList.append(resultdate)
    caoncatDate = pd.concat(resultDateList, axis=0)
    print(f'本次属于在缴人员的数据有{len(readOtherExcel)}条')
    # print(caoncatDate)
    mergeDate = pd.merge(readDate, caoncatDate, how='outer', on=['证件号码'])
    # print(mergeDate)
    # print(mergeDate.columns)

    # 这4列特殊，都需要进行保留两位小数操作后在进行比对
    Keep_two_decimal_List=['社保个人合计','社保台账个人合计','社保单位合计','社保台账单位合计']
    for Keepitem in Keep_two_decimal_List:
        mergeDate[Keepitem] = mergeDate[Keepitem].map(lambda x: round(x, 2))

    # 可以根据需要添加更多列对(需要相互比较的列明)
    column_pairs=[('社保应收合计', '社保台账应收合计'), ('社保个人合计', '社保台账个人合计'), (
    '社保单位合计', '社保台账单位合计'), ('养老保险缴费基数', '养老缴费基数'),
    ('养老保险个人交', '养老个人交'), ('养老保险单位交', '养老单位交'), ('医疗保险缴费基数', '医疗缴费基数'), (
    '医疗保险个人交', '医疗个人交'), ('医疗保险单位交', '医疗单位交'), ('工伤保险缴费基数', '工伤缴费基数'),
    ('工伤保险单位交', '工伤单位交'), ('失业保险缴费基数', '失业缴费基数'), ('失业保险个人交', '失业个人交'), (
    '失业保险单位交', '失业单位交'), ('生育医疗缴费基数', '医疗缴费基数'), ('生育医疗单位交', '生育单位交')]
    # column_pairs = [('生育医疗单位交', '医疗单位交')]

    # 使用列表解析来创建条件 判断是否相等,不相等的为ture ,相等的为false
    conditions = [mergeDate[col1] != mergeDate[col2] for col1, col2 in column_pairs]
    # print(conditions)
    # # 使用any函数来检查任何条件是否为True
    mask = pd.concat(conditions, axis=1).any(axis=1)
    #
    # # 使用布尔mask来筛选行
    filtered_df = mergeDate[mask]
    print(f'得到下载数据与缴交数据不相同的数据有{len(filtered_df)}条')
    filtered_df.to_excel(核对结果文件路径)



checkDate()

# def chuli():
# 用户配置表 = '../文件/社保用户配置表.xlsx'
# list = ['120223197912152512', '41148119860611092X', '42058219801208275X', '420582198406072765',
#         '420822198410015755', '431003198607201316', '452324198109140357']
# # 打开Excel文件
# workbook = openpyxl.load_workbook(用户配置表)
# # 选择要写入数据的表格
# sheet = workbook.active
# # 指定要写入数据的行和列
# row = 4
# column = 1
# # 写入数据
# sheet.cell(row=row, column=column, value=list)
# # 保存Excel文件
# workbook.save(用户配置表)

# chuli()

# ite = ['序号', '电脑号', '姓名', '身份证号', '应收合计', '个人合计', '单位合计', '缴费基数', '个人交', '单位交',
#        '缴费基数.1', '个人交.1', '单位交.1', '缴费基数.2', '单位交.2', '缴费基数.3', '个人交.2',
#        '单位交.3', '缴费基数.4', '单位交.4']
# 社保待缴人员表新表头 = ['序号', '电脑号', '姓名', '证件号码', '社保应收合计', '社保个人合计', '社保单位合计',
#                         '养老保险缴费基数', '养老保险个人交', '养老保险单位交',
#                         '医疗保险缴费基数', '医疗保险个人交', '医疗保险单位交', '工伤保险缴费基数', '工伤保险单位交',
#                         '失业保险缴费基数', '失业保险个人交',
#                         '失业保险单位交', '生育医疗缴费基数', '生育医疗单位交']
# maps = {}
# for i in range(0, len(ite)):
#     maps.setdefault(ite[i], 社保待缴人员表新表头[i])
# 社保待缴人员表新表头Map = {'身份证号': '证件号码', '应收合计': '社保应收合计', '个人合计': '社保个人合计',
#                                '单位合计': '社保单位合计', '缴费基数': '养老保险缴费基数', '个人交': '养老保险个人交',
#                                '单位交': '养老保险单位交', '缴费基数.1': '医疗保险缴费基数',
#                                '个人交.1': '医疗保险个人交', '单位交.1': '医疗保险单位交',
#                                '缴费基数.2': '工伤保险缴费基数', '单位交.2': '工伤保险单位交',
#                                '缴费基数.3': '失业保险缴费基数', '个人交.2': '失业保险个人交',
#                                '单位交.3': '失业保险单位交', '缴费基数.4': '生育医疗缴费基数',
#                                '单位交.4': '生育医疗单位交'}
# print(maps)
